"use strict";
//泛型
//只能返回string类型的数据
/*
    function getData(value: string): string{
        return value
    }
*/
//同时返回string类型和number类型    any可以解决
//any放弃了类型检查，传入什么 返回什么。比如传入number类型必须返回number类型
//传入的参数类型和返回的参数类型可以不一致
// function getData(value: any): any{
//     return value
// }
//泛型：可以支持不特定的数据类型  要求：传入的参数类型和返回的参数类型
//T表示泛型，具体什么类型是调用这个方法的时候决定的
/*
    function getData<T>(value: T): T{
        return value
    }
    console.log(getData<number>(123));
    console.log(getData<string>('grdgfdgerd'));
*/
// function getData<T>(value: T): any{
//     return '3243434343'
// }
// console.log(getData<number>(1))  //参数必须是number
// console.log(getData<string>('这是一个泛型'))
//泛型类： 比如有个最小堆算法，需要同时支持返回数字和字符串(a-z)两种类型。
//通过类的泛型来实现
/*
class MinClass{
    public list: number[] = [];
    add(num: number) {
        this.list.push(num)
    }
    min(): number{
        var minNum = this.list[0]
        for (var i = 0; i < this.list.length; i++){
            if (minNum > this.list[i]) {
                minNum = this.list[i]
            }
        }
        return minNum
    }
}
var m = new MinClass()
m.add(2)
m.add(22)
m.add(33)
m.add(1)
console.log(m.min())
*/
//定义类的泛型
/*
    class MinClass<T>{
        public list: T[] = [];
        add(num: T) {
            this.list.push(num)
        }
        min(): T{
            var minNum = this.list[0]
            for (var i = 0; i < this.list.length; i++){
                if (minNum > this.list[i]) {
                    minNum = this.list[i]
                }
            }
            return minNum
        }
    }
    var m1 = new MinClass<number>() //实例化类 并且定制了勒的T待变的类型是number类型
    m1.add(3)
    m1.add(5)
    m1.add(45)
    m1.add(7)
    console.log(m1.min())

    var m2 = new MinClass<string>()
    m2.add('b')
    m2.add('a')
    m2.add('d')
    m2.add('z')
    console.log(m2.min())
*/
//函数类型接口
/*
    interface ConfigFn{
        (value1: string, value2: string): string
    }

    var setData: ConfigFn = function (value1: string, value2: string): string{
        return value1+value2
    }
    console.log(setData('name', '张三'))
*/
//1.泛型接口
/*
    interface ConfigFn{
        <T>(value:T): T
    }

    var setData: ConfigFn = function <T>(value:T): T{
        return value
    }
    console.log(setData<string>('name'))
*/
//2.泛型接口
/*
    interface ConfigFn<T>{
        <T>(value:T): T
    }

    function getData<T>(value:T): T{
        return value
    }
    var myGetData: ConfigFn<string> = getData;
    console.log(myGetData('20'))
*/ 
